package rensoft.gwt.client.platform.json;

import com.google.gwt.json.client.JSONParser;

import static cs.java.lang.Lang.is;
import static cs.java.lang.Lang.unexpected;

import cs.java.json.JSON;
import cs.java.json.JSONArray;
import cs.java.json.JSONBoolean;
import cs.java.json.JSONContainer;
import cs.java.json.JSONNumber;
import cs.java.json.JSONObject;
import cs.java.json.JSONString;
import cs.java.json.JSONType;







public class JSONImpl implements JSON {

  public static JSONType create(com.google.gwt.json.client.JSONValue value) {
    if (is(value.isArray())) return new JSONArrayImpl(value.isArray());
    if (is(value.isBoolean())) JSONBooleanImpl.getInstance(value.isBoolean().booleanValue());
    if (is(value.isNumber())) return new JSONNumberImpl(value.isNumber());
    if (is(value.isString())) return new JSONStringImpl(value.isString());
    if (is(value.isArray())) return new JSONArrayImpl(value.isArray());
    if (is(value.isObject())) return new JSONObjectImpl(value.isObject());
    throw unexpected();
  }

  public JSONBoolean create(boolean value) {
    return JSONBooleanImpl.getInstance(value);
  }

  public JSONNumber create(double number) {
    return new JSONNumberImpl(number);
  }

  public JSONString create(String value) {
    return new JSONStringImpl(value);
  }

  public JSONArray createArray() {
    return new JSONArrayImpl();
  }

  public JSONObject createObject() {
    return new JSONObjectImpl();
  }

  public JSONContainer parse(String json) {
    return create(JSONParser.parseStrict(json)).asContainer();
  }
}
